package com.example.CloudWeather.ui.me

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.LayoutInflater
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.example.CloudWeather.R
import com.example.CloudWeather.WeatherApplication
import com.example.CloudWeather.base.BaseBindingActivity
import com.example.CloudWeather.databinding.ActChangeAvatarBinding
import com.example.CloudWeather.storage.TokenPreferences
import com.example.CloudWeather.util.AvatarUploader
import kotlinx.coroutines.launch

class ChangeAvatarActivity : BaseBindingActivity<ActChangeAvatarBinding>() {
    // 图片地址
    var imageUrl: String? = null
    private val REQUEST_CODE_SELECT_IMAGE: Int = 2
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setOnClickEvent()
        // 打印用户信息
        Log.d("ChangeAvatarActivity", "用户信息: ${WeatherApplication.user}")
        // 保存图片地址
        imageUrl = WeatherApplication.user.avatar
        // 调用方法 加载图片
        loadImage()
    }
    private fun loadImage() {
        // 使用 Glide 加载 imageUrl 对应的图片
        lifecycleScope.launch {
            Glide.with(this@ChangeAvatarActivity)
                .load(imageUrl)
                .apply(
                    // 创建 RequestOptions 对象来配置图片加载选项
                    RequestOptions()
                        // 将图片裁剪为圆形显示
                        .circleCrop()
                        // 设置占位图，加载图片时显示默认头像
                        .placeholder(R.mipmap.avatar1)
                        // 设置错误图，图片加载失败时显示默认头像
                        .error(R.mipmap.avatar1)
                )
                .into(binding.ivAvatar)
        }
        // 加载成功之后 设置给 头像 id为 ivAvatar
    }

    override fun initBinding(layoutInflater: LayoutInflater): ActChangeAvatarBinding {
        return ActChangeAvatarBinding.inflate(layoutInflater)
    }

    /**
     * 设置点击事件
     */
    fun setOnClickEvent() {
        binding.ivBack.setOnClickListener { finish() }
        binding.ivAvatar.setOnClickListener { showImagePickerDialog() }
        binding.ivEditAvatar.setOnClickListener { showImagePickerDialog() }
    }
    private fun showImagePickerDialog() {
        val options = arrayOf<CharSequence>("拍照", "从相册选择", "取消")
        val builder = android.app.AlertDialog.Builder(this)
        builder.setTitle("选择头像")
        builder.setItems(options) { dialog, item ->
            when {
                options[item] == "拍照" -> {
                    takePhoto()
                }
                options[item] == "从相册选择" -> {
//                    pickFromGallery()
                    selectFromAlbum()
                }
                options[item] == "取消" -> {
                    dialog.dismiss()
                }
            }
        }
        builder.show()
    }

    /**
     * 从相册选择
     */
//    private fun pickFromGallery() {
//        // TODO
//    }
    fun selectFromAlbum() {
        // 拉起相册，只允许选择图片，只允许选择一张
        // 获取用户选择的图片，并设置到页面中
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        intent.type = "image/*"
        // 使用新的 Activity Result API 启动相册选择
        imagePickerLauncher.launch(intent)
    }


    /**
     * 拍照
     */
    private fun takePhoto() {
        // TODO
    }

    /**
     * 从相册中选择图片或文件
     *
     * 此函数用于启动相册选择器，允许用户从设备相册中选择图片或其他文件。
     * 具体实现可能涉及启动系统相册应用或自定义的选择界面。
     */

    // 使用新的 Activity Result API 替代 startActivityForResult
    private val imagePickerLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        // 处理选择图片后的结果
        if (result.resultCode == RESULT_OK) {
            // 获取用户选择的图片 URI
            val selectedImageUri: Uri? = result.data?.data

            // 如果成功获取到 URI，则加载并显示图片
            selectedImageUri?.let { uri ->
                // 将uri 设置给图片 ivAvatar
                binding.ivAvatar.setImageURI(uri)
                // 将图片 上传到 接口服务器，将回传的地址设置给 用户头像
                // 保存上下文对象
                var ctx = this@ChangeAvatarActivity
                AvatarUploader(
                    ctx,
                    TokenPreferences.getInstance(ctx).getToken().toString(),
                    { url, error ->
                        if (error == null) {
//                            Toast.makeText(this, url, Toast.LENGTH_SHORT).show()
//                            Log.d("AvatarUploader", "上传成功")
                            imageUrl = url
                            // 更新一下 用户界面的头像
//                            WeatherApplication.user.avatar = url.toString()
                            loadImage()
                        } else {
                            // 上传失败
                            Toast.makeText(this, "上传失败", Toast.LENGTH_SHORT).show()
                        }
                    }
                )
                    .uploadAvatar(uri)

            }
        }
    }

}